2024.6.25 二重積分【scipy】
scipy.dblquad()を用いて二重積分を計算することができる。
integrate.dblquad(関数名, 積分区間2小, 積分区間2大, 積分区間1小, 積分区間1大)
積分区間1が積分区間2の変数に依存する場合には関数として指定する必要がある。そこでラムダ関数が用いられる。
積分の対象となる関数を作るとき、第1引数が積分区間2(2回目の積分)、第2引数が積分区間1(1回目の積分)の変数に対応する。
例題1
1回目に積分する変数$ xは区間が$ 0\leq x \leq 1、2回目に積分する変数$ yは区間$ 2\leq y \leq 3とする。つまり、1回目の積分区間が2回目の変数に影響を受けない(四角く重積分する)状況を考える。
$ I = \int_{2}^{3}\int_{0}^{1} x^2 y {\mathrm d}x \mathrm{d} y
code:integrate2.py
import numpy as np
import scipy.integrate as integrate
def func1(x, y):
return x**2*y
ans1, acc1 = integrate.dblquad(func1, 2, 3, 0, 1)
print(ans1, acc1)
code:result1.txt
0.8333333333333333 1.109419438358333e-14
例題2
1回目に積分する変数は$ xで区間が$ 1-y\leq x \leq 1、2回目に積分する変数は$ yで区間は$ 0\leq y \leq 1である。
code:integrate2.py
import numpy as np
import scipy.integrate as integrate
def func2(x,y):
return x*y**2
ans2, acc2 = integrate.dblquad(func2, 0 , 1, lambda y:1-y, 1)
print(ans2, acc2)
code:result2.txt
0.15 5.5270076486663465e-15
ラムダ関数においては、変数の順序だけ対応していればよく、変数名は結果に作用しない。
例題3
積分する変数の順序を入れ替える例。
code:integrate3.py
import numpy as np
import scipy.integrate as integrate
def func3(y, x):
return -1 / ((2*x + y + 1)**2)
ans3,acc3 = integrate.dblquad(func3, 0, 1, lambda x:x**2, lambda x:x)
print(ans3, acc3)
print('参考:',np.log(4)/3 - 1/2)
code:result3.txt
-0.03790187962670312 5.409483724085358e-11
参考: -0.03790187962670316